#!/usr/bin/python3
# -*- coding: utf-8 -*-
'''
浏览器配置：
用于设置chrome浏览器，目前使用过的参数：
1、阻止chrome弹窗的出现：'profile.default_content_setting_values' :{'notifications' : 2}
2、不加载图片："profile.managed_default_content_settings.images":2
3、无头浏览器，--headless

浏览器操作：
#selenium.webdriver.remote.webdriver.WebDriver
    close（）：关闭当前窗口
    execute_async_script（）：异步执行js代码
    execute_script（）：同步执行js代码
    quit()：关闭驱动以及所有窗口
    get（url）：获得某个页面
    set_window_size(width, height, windowHandle='current')：设置窗口大小
    maximize_window():窗口最大化
    page_source属性，获得当前页面的html代码
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);"：对于下滑翻页的网站，执行下滑翻页！
    find_element_by_id:全文查找，根据完整的id值查找，返回selenium.webdriver.remote.webelement.WebElement对象
    find_element_by_class_name:全文查找，根据完整的class值查找，返回selenium.webdriver.remote.webelement.WebElement对象
    find_element_by_xpath(xpath):全文查找，根据xpath查找，返回selenium.webdriver.remote.webelement.WebElement对象
    #定位到最新打卡的窗口
        windows = driver.window_handles
        driver.switch_to.window(windows[-1])

操作页面内元素:
click——点击对象
send_keys——在对象上模拟按键输入
clear——清除对象的内容，如果可以的话
submit——提交对象的内容，如果可以的话
text——用于获取元素的文本信息
    driver.find_element_by_id("user_name").clear()
    driver.find_element_by_id("user_name").send_keys("fnngj")

鼠标事件：
ActionChains 常用方法：
perform()  执行所有ActionChains 中存储的行为；
context_click()  右击；
double_click()   双击；
drag_and_drop()  拖动；
move_to_element()  鼠标悬停。
    #定位到要双击的元素
     qqq =driver.find_element_by_xpath("xxx")
    #对定位到的元素执行鼠标双击操作
     ActionChains(driver).double_click(qqq).perform()

     #拖放元素
     #定位元素的原位置
    element = driver.find_element_by_name("source")
    #定位元素要移动到的目标位置
    target = driver.find_element_by_name("target")
    #执行元素的移动操作
    ActionChains(driver).drag_and_drop(element, target).perform()

frame切换：
    #先找到到 ifrome1（id = f1）
    browser.switch_to_frame("f1")

CentOS环境：
# 安装selenium
pip install selenium

# 安装chrome-browser
wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm --no-check-certificate
sudo yum install google-chrome-stable_current_x86_64.rpm
# 根据chrome安装对应版本的chromedriver：
http://npm.taobao.org/mirrors/chromedriver/

'''
import random
import time

import eventlet
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait

from com.wushi.SeleniumLearning.spider_config import PROXY, USER_AGENT_LIST, DRIVER
from wushi.SeleniumLearning import spider_config
from wushi.utils.logutil import LogUtil
from wushi.vipspider.spider_config import THREAD_POOL_SIZE

__author__ = 'Grant Wu'

logger = LogUtil("xiaohongshu", __name__)
datas = [x for x in range(0, 100)]

class Spider_Test:
    def __init__(self, shading_index):
        proxy = random.choice(PROXY)
        user_agent = random.choice(USER_AGENT_LIST)

        options= webdriver.ChromeOptions()
        # 使用headless无界面浏览器模式
        options.add_argument('--headless')
        options.add_argument('--disable-gpu')
        options.add_argument('--user-agent=%s' % user_agent)
        # centos环境下在root权限下运行
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')

        options.add_argument('--proxy-server=%s' % proxy)
        # 指定webdriver的路径
        self.chrome = webdriver.Chrome(DRIVER, options=options)
        self.shading_index =shading_index

    def run(self):
        # 隐式等待5秒
        self.chrome.implicitly_wait(5)

        self.chrome.get('https://www.baidu.com')
        time.sleep(1)
        logger.info('=====>finished')
        # 截图当前窗口！！
        self.chrome.save_screenshot("baidu.png")
        logger.info(self.chrome.page_source)
        # 输入数据； 等待最大10秒
        WebDriverWait(self.chrome,5).until(expected_conditions.visibility_of_element_located((By.ID,'kw')))
        self.chrome.find_element_by_id('kw').send_keys('服饰')
        # 点击按钮
        WebDriverWait(self.chrome, 5).until(expected_conditions.visibility_of_element_located((By.ID, 'su')))
        self.chrome.find_element_by_id('su').click()
        WebDriverWait(self.chrome, 5).until(expected_conditions.title_contains('百度搜索'))
        self.chrome.save_screenshot("baidu2.png")
        logger.info(self.chrome.page_source)
        # 窗口回退
        self.chrome.back()
        WebDriverWait(self.chrome, 5).until(expected_conditions.title_contains('百度一下'))
        self.chrome.save_screenshot("baidu3.png")

        self.chrome.quit()


    def run_async(self):
        # 隐式等待5秒
        self.chrome.implicitly_wait(5)

        self.chrome.get('https://www.baidu.com')
        time.sleep(1)
        logger.info(self.chrome.page_source)
        for data in datas:
            if(hash(data) % 4 == self.shading_index):
                logger.info('======>thread-{}, data:{}',self.shading_index,data)
        self.chrome.quit()
        logger.info('=====>finished')

# def gogo(i):
#     spider = Spider_Test(i)
#     spider.run_async()

if __name__ == '__main__':
    # vip = Spider_Test()
    # vip.run()
    eventlet.monkey_patch(socket=True, select=True)
    pool = eventlet.GreenPool(THREAD_POOL_SIZE)
    for i, proxy in enumerate(PROXY):
        # pool.spawn_n(gogo, i)
        spider = Spider_Test(i)
        pool.spawn_n(spider.run_async)
    pool.waitall()